
import os
import sys
from pathlib import Path
import django
from typing import List

# 将项目根目录添加到 Python 路径
project_root = Path(__file__).resolve().parent.parent
if str(project_root) not in sys.path:
    sys.path.append(str(project_root))

# 设置 Django 配置模块（对应项目中的 testsys/settings.py）
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testsys.settings')
# 初始化 Django 环境，使脚本能够访问 Django 项目的模型和其他组件
django.setup()

import logging
from datetime import date
from core.models import DailyAttendance, Student, SchoolSchedule
from core.models.homework import Homework
from core.models.homework_submission import HomeworkSubmission

# 配置日志记录，设置日志级别为 INFO
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


def insert_daily_attendance_records() -> None:
    """
    每日定时插入新的考勤记录

    功能: 对所有学生创建当天的考勤记录，如果该记录不存在
    条件: 仅在学校上课日执行
    返回: 无
    """
    today = date.today()
    # 检查是否是学校正常的上课日期
    if not SchoolSchedule.check_class_day(today):
        logger.info(f'{today} 不是上课日，跳过考勤记录创建')
        return

    # 获取所有学生
    students = Student.objects.all()
    new_records: List[DailyAttendance] = []

    # 遍历每个学生，检查并创建新的考勤记录
    for student in students:
        # 检查是否已经存在当天的考勤记录
        if not DailyAttendance.objects.filter(student=student, date=today).exists():
            # 创建新的考勤记录对象（暂不保存到数据库）
            new_record = DailyAttendance(
                student=student,
                date=today,
                morning_attendance=False,
                afternoon_attendance=False,
                evening_attendance=False,
            )
            new_records.append(new_record)

    # 批量创建考勤记录，提高数据库操作效率
    if new_records:
        DailyAttendance.objects.bulk_create(new_records)
        logger.info(f'成功创建 {len(new_records)} 条考勤记录')
    else:
        logger.info('所有学生当天的考勤记录已存在，无需创建')


def insert_daily_homework_records() -> None:
    """
    定时插入学生作业提交记录

    功能: 为已到截止日期但学生未提交的作业创建提交记录
    条件: 仅在学校上课日执行
    返回: 无
    """
    today = date.today()
    if not SchoolSchedule.check_class_day(today):
        logger.info(f'{today} 不是上课日，跳过作业提交记录创建')
        return

    # 获取已到截止日期的作业
    overdue_homeworks = Homework.objects.filter(due_date__lte=today)
    new_submissions: List[HomeworkSubmission] = []

    for homework in overdue_homeworks:
        # 获取该作业所属班级的所有学生
        class_subject = homework.class_subject
        classinfo = class_subject.class_id
        students = Student.objects.filter(classes=classinfo)

        for student in students:
            # 检查该学生是否已有该作业的提交记录
            if not HomeworkSubmission.objects.filter(homework=homework, student=student).exists():
                # 创建新的作业提交记录对象（暂不保存到数据库）
                submission = HomeworkSubmission(
                    homework=homework,
                    student=student,
                    status='good'  # 这里状态设为'good'，但注释说明是未提交，可能需要确认实际业务逻辑
                )
                new_submissions.append(submission)
                logger.info(f"为学生 {student.name} 创建了作业 {homework.id} 的提交记录")

    # 批量创建作业提交记录，提高数据库操作效率
    if new_submissions:
        HomeworkSubmission.objects.bulk_create(new_submissions)
        logger.info(f'成功创建 {len(new_submissions)} 条作业提交记录')
    else:
        logger.info('所有学生的作业提交记录已存在，无需创建')

if __name__ == '__main__':
    insert_daily_attendance_records()
    insert_daily_homework_records()
